home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
tex
/
td187src.lzh
/
MTMENUS.I
< prev
next >
Wrap
Text File
|
1991-06-08
|
15KB
|
496 lines
(*#######################################################################
M A G I C M E N U S
#######################################################################
V1.02 27.10.90 Peter Hellinger
V1.01 21.10.90 Peter Hellinger
V1.00 02.09.90 Peter Hellinger
#######################################################################*)
IMPLEMENTATION MODULE mtMenus;
(*------------------------------*)
(* COMPILERSWITCHES *)
(*------------------------------*)
(* TDI-Version: DEAKTIVIERT *)
(*------------------------------*)
(* V- Overflow-Checks *)
(* R- Range-Checks *)
(* S- Stack-Check *)
(* N- NIL-Checks *)
(* T- TDI-Compiler vor 3.01 *)
(* Q+ Branch statt Jumps *)
(* *)
(*------------------------------*)
(* MM2-Version: AKTIVIERT *)
(*------------------------------*)
(*$R- Range-Checks *)
(*$S- Stack-Check *)
(* *)
(*------------------------------*)
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7,
Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14, Bit15,
LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL, sBITSET,
lWORD, lINTEGER, lCARDINAL, lBITSET,
CastToChar, CastToByte, CastToByteset, CastToInt,
CastToCard, CastToBitset, CastToWord, CastToLInt,
CastToLCard, CastToLBitset, CastToLWord, CastToAddr;
FROM MagicAES IMPORT GBOX, GTEXT, GBOXTEXT, GIBOX, GSTRING, GTITLE,
Exit, DISABLED, OBJECT, ObjcDraw, ObjcFind,
BEGMCTRL, ENDMCTRL, WindUpdate, WFFULLXYWH, WindGet,
FormButton, GrafHandle, MUKEYBD, MUBUTTON, MUM1,
MUM2, MUMESAG, MUTIMER, EvntMulti, AESIntIn, AESIntOut,
AESCall;
FROM mtAppl IMPORT VDIHandle, MouseOn, MouseOff, MouseArrow;
FROM mtArea IMPORT AREA, NewAREA, DisposeAREA, FreeArea, SaveArea,
CopyArea, RestoreArea, MOVEUP, MOVEDOWN, MOVELEFT,
MOVERIGHT, MoveArea;
FROM MagicStrings IMPORT Assign, Append, Length;
IMPORT MagicAES, MagicVDI;
CONST MaxObjects = 51;
Links = Bit0;
Rechts = Bit1;
CONST Enter = 072H;
Return = 01CH;
CurUp = 048H;
CurDown = 050H;
CurLeft = 04BH;
CurRight = 04DH;
Undo = 061H;
TYPE tRect = RECORD
x, y, w, h: sINTEGER;
END;
TYPE obTree = POINTER TO ARRAY [0..1000] OF MagicAES.OBJECT;
tString = ARRAY [0..40] OF CHAR;
TYPE MENUBAR = POINTER TO Menubar;
Menubar = RECORD
line: ARRAY [0..255] OF CHAR;
tree: obTree;
num: sINTEGER;
win: sINTEGER;
sub: sINTEGER;
start: sINTEGER;
draw: sINTEGER;
spos: sINTEGER;
entry: ARRAY [0..MaxObjects] OF RECORD
text: ARRAY [0..40] OF CHAR;
width: sINTEGER;
pos: sINTEGER;
END;
react: RECORD
x: sINTEGER;
y: sINTEGER;
w: sINTEGER;
h: sINTEGER;
END;
END;
VAR Dropdown: ARRAY [0..MaxObjects] OF OBJECT;
menuArea: AREA;
BAR: MENUBAR;
b: sBITSET;
bool, rekExit: BOOLEAN;
screen: tRect;
chW, chH: sINTEGER;
bW, bH: sINTEGER;
mWidth: sINTEGER;
mHeight: sINTEGER;
ScrollStr: ARRAY [0..9] OF CHAR;
PROCEDURE scanType (t: obTree; entry, flag: sINTEGER): sINTEGER;
(* Scannt nach einem bestimmten Typflag *)
VAR o, r: sINTEGER;
BEGIN
o:= entry;
WHILE (o >= entry) DO
WITH t^[o] DO
IF flag = obType THEN rekExit:= TRUE; RETURN o; END;
IF (obHead > -1) THEN
r:= scanType (t, obHead, flag);
IF rekExit THEN RETURN r; END;
END;
o:= obNext;
END;
END;
RETURN 0;
END scanType;
PROCEDURE DoEvent (VAR x, y: sINTEGER;
VAR button: sBITSET;
VAR scan: sINTEGER): sBITSET;
VAR event: sBITSET;
i: sINTEGER;
split: RECORD
CASE: BOOLEAN OF
TRUE: wert: sINTEGER;|
FALSE: hi: CHAR;
lo: CHAR;|
END;
END;
BEGIN
(* Array's laden *)
event:= {MUKEYBD, MUTIMER, MUBUTTON};
AESIntIn[ 0]:= CastToInt (event);
AESIntIn[ 1]:= 257;
AESIntIn[ 2]:= 3;
AESIntIn[ 3]:= 0;
i:= AESCall(25, 16, 7, 1, 0);
event:= CastToBitset (i);
x:= AESIntOut[1];
y:= AESIntOut[2];
button:= CastToBitset (AESIntOut[3]);
(* kbshift:= CastToBitset (AESIntOut[4]); *)
split.wert:= AESIntOut[5];
scan:= ORD (split.hi);
(* ascii:= split.lo; *)
RETURN event;
END DoEvent;
PROCEDURE Entprelle;
VAR x, y: sINTEGER;
button: sBITSET;
BEGIN
REPEAT
MagicAES.GrafMkstate (x, y, button, b);
UNTIL button = {};
END Entprelle;
PROCEDURE GetMenu (mx, my: sINTEGER): sINTEGER;
VAR j: sINTEGER;
BEGIN
WITH BAR^ DO
WITH react DO
IF (my > y) AND (my < (y + h)) THEN
IF (mx > x) AND (mx < (x + 3 * chW)) THEN RETURN -2; END;
IF (mx > (x + 3 * chW) - 1) AND (mx < (x + 6 * chW)) THEN RETURN -3; END;
FOR j:= start TO draw DO
IF (mx >= (x + entry[j].pos)) AND
(mx <= (x + entry[j].pos + entry[j].width)) THEN
RETURN j;
END;
END;
END;
END;
END;
RETURN -1;
END GetMenu;
PROCEDURE DoMenu (t: obTree; drop: sINTEGER): sINTEGER;
VAR mx, my, ox, oy, i, j, o: sINTEGER;
ob, oldob, taste, scan, clicks: sINTEGER;
button, kbshift, event: sBITSET;
ascii: CHAR;
PROCEDURE DrawBar (o: sINTEGER);
VAR r: tRect;
BEGIN
IF o > 0 THEN
r.x:= t^[0].obX + t^[o].obX;
r.y:= t^[0].obY + t^[o].obY;
r.w:= r.x + t^[o].obWidth - 1;
r.h:= r.y + t^[o].obHeight - 1;
MagicVDI.Bar (VDIHandle, r);
END;
END DrawBar;
BEGIN
i:= MagicVDI.SetFillcolor (VDIHandle, 1);
bool:= MagicVDI.SetFillperimeter (VDIHandle, FALSE);
oldob:= -1; ob:= -1; ox:= -1; oy:= -1;
LOOP
event:= DoEvent (mx, my, button, scan);
(* Anderes Menü gewählt? *)
j:= GetMenu (mx, my);
IF (j # -1) AND (j # drop) THEN RETURN -1; END;
(* Objekt finden *)
IF (mx # ox) OR (my # oy) THEN
ob:= MagicAES.ObjcFind (t, 0, MaxObjects, mx, my); ox:= mx; oy:= my;
END;
IF (MUKEYBD IN event) THEN
CASE scan OF
Return,
Enter: MouseOff; DrawBar (oldob); MouseOn; EXIT;
|
CurUp: o:= ob;
IF o > 1 THEN
DEC (o);
IF (DISABLED IN t^[o].obState) THEN DEC (o); END;
IF o >= 1 THEN ob:= o; END;
ELSE
ob:= t^[0].obTail;
END;
|
CurDown: o:= ob;
IF (o < t^[0].obTail) AND (o > 0) THEN
INC (o);
IF (DISABLED IN t^[o].obState) THEN INC (o); END;
IF o <= t^[0].obTail THEN ob:= o; END;
ELSE
ob:= 1;
END;
|
Undo: ob:= -1; EXIT;
|
ELSE ;
END;
END;
(* Rechte Maust